Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Как подсчитать интервалы между датами в таблице? (RomanovAS)
Author Message
RomanovAS
Участник форума



Joined: 17 May 2007
Posts: 29
Карма: 2
   поощрить/наказать


PostPosted: Fri May 18, 2007 8:24 am (написано за 10 минут 11 секунд)
   Post subject: Как подсчитать интервалы между датами в таблице?
Reply with quote

Всем привет!

Помогите пожалуйста решить проблемму.

Есть некоторая таблица MySQL:
Code (SQL): скопировать код в буфер обмена
house_class

id    number            date
1        1        10.05.2007
2        1        11.05.2007
3        1        12.05.2007
4        1        15.05.2007
5        1        16.05.2007
6        1        17.05.2007
...        ...        ...
В данной таблице фиксируется номер дома и дата когда этот дом занят. Как видно из таблицы дом занят с 10.05.2007 по 12.05.2007, а затем с 15.05.2007 по 17.05.2007. Как правильно подсчитать интервалы между датами и выстроить запрос, чтобы человек, который хочет занять дом с 13.05.2007 по 18.05.2007 получил отрицательный результат и не получилось наложения в расписании. Я пробовал сам сделать, высчитав отсутсвие этих дат в таблице, но так не получается. Как решить эту задачу? Что можно сделать?

Заранее спасибо!
Back to top
View user's profile Send private message
Bueno
Участник форума



Joined: 13 Feb 2007
Posts: 32
Карма: 2
   поощрить/наказать


PostPosted: Fri May 18, 2007 8:54 am (спустя 29 минут; написано за 3 минуты 21 секунду)
   Post subject:
Reply with quote

а почему бы вам не использовать конструкцию типа
Code (SQL): скопировать код в буфер обмена
house_class

id    number      start_date     end_date
1        1        10.05.2007    12.05.2007
2        1        15.05.2007    17.05.2007
зы.. кстати если вы для дат будете использовать формат DATE, то вы сможете исспользовать BETWEEN, MAX и прочие вкусности в запросе..
Back to top
View user's profile Send private message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Fri May 18, 2007 11:56 am (спустя 3 часа 2 минуты; написано за 1 минуту 53 секунды)
   Post subject:
Reply with quote

Bueno, спасибо огромное за ответ!

У меня была идея использовать именно в том формате как вы сказали, однако и в этом случае я не знаю как правильно все посчитать и выстроить запрос. Если вас не затруднит, то может подскажете как это сделать? Заранее спасибо!
Back to top
RomanovAS
Участник форума



Joined: 17 May 2007
Posts: 29
Карма: 2
   поощрить/наказать


PostPosted: Fri May 18, 2007 12:00 pm (спустя 3 минуты; написано за 1 минуту 21 секунду)
   Post subject:
Reply with quote

Извиняюсь за повтор. Забыл залогиниться...

Bueno, спасибо огромное за ответ!

У меня была идея использовать именно в том виде как вы сказали, однако и в этом случае я не знаю как правильно все посчитать и выстроить запрос. Естественно я буду использовать формат DATE. Если вас не затруднит, то может подскажете как это сделать? Заранее спасибо!
Back to top
View user's profile Send private message
Никита Косолaпов
Участник форума



Joined: 08 Aug 2006
Posts: 172
Карма: 9
   поощрить/наказать

Location: Москва

PostPosted: Fri May 18, 2007 2:04 pm (спустя 2 часа 4 минуты; написано за 7 секунд)
   Post subject:
Reply with quote

читать тут: www.mysql.ru/docs/man/Date_and_time_functions.html
Back to top
View user's profile Send private message Send e-mail
RomanovAS
Участник форума



Joined: 17 May 2007
Posts: 29
Карма: 2
   поощрить/наказать


PostPosted: Fri May 18, 2007 2:48 pm (спустя 43 минуты; написано за 41 секунду)
   Post subject:
Reply with quote

Я там уже был, но ничего не нашел. Если кому не трудно, напишите пожалуйста. Заранее спасибо!
Back to top
View user's profile Send private message
Bueno
Участник форума



Joined: 13 Feb 2007
Posts: 32
Карма: 2
   поощрить/наказать


PostPosted: Fri May 18, 2007 3:08 pm (спустя 19 минут; написано за 4 минуты 46 секунд)
   Post subject:
Reply with quote

а почему бы просто не информировать о занятых днях?.. отсюда, кстати, и о свободных..

а вот достать период(ы), который пересекается с требуемым можно так
Code (SQL): скопировать код в буфер обмена
SELECT * FROM `table`
WHERE (`start_date` BETWEEN '2007-05-13' AND '2007-05-18') OR (`end_date` BETWEEN '2007-05-13' AND '2007-05-18')
сработает при условии, что поля start_date и end_date имеют формат DATE..
Back to top
View user's profile Send private message
RomanovAS
Участник форума



Joined: 17 May 2007
Posts: 29
Карма: 2
   поощрить/наказать


PostPosted: Fri May 18, 2007 3:39 pm (спустя 31 минуту; написано за 56 секунд)
   Post subject:
Reply with quote

Спасибо огромное, Bueno! Ещё подумаю, завтра напишу. Буду очень благодарен, если поможешь еще.
Back to top
View user's profile Send private message
Михаил Саяпин
Участник форума



Joined: 07 Apr 2007
Posts: 46
Карма: 15
   поощрить/наказать

Location: Санкт-Петербург

PostPosted: Sat May 19, 2007 9:21 am (спустя 17 часов 42 минуты; написано за 5 минут 56 секунд)
   Post subject:
Reply with quote

Здравствуйте. :)

В свое время решал примерно такую же задачку "для пытливых умов".
Здесь www.mechsoft.ru/forum/index.php?topic=625.0 ее условие и решение, а вот она же, переложенная в термины текущей задачи:
Code (SQL): скопировать код в буфер обмена
(SELECT
    number AS lookupHouse,
    end_date AS rentEndDay,
    coalesce((SELECT min(start_date) FROM house_class WHERE start_date > hc.end_date AND number = lookupHouse),
        '...and to the very end.') AS nextRentBegins
FROM
    house_class hc
WHERE
    (SELECT count(*) FROM house_class WHERE number = lookupHouse AND rentEndDay > start_date AND rentEndDay < end_date) = 0)

union DISTINCT

(SELECT
    number AS lookupHouse,
    coalesce((SELECT max(end_date) FROM house_class WHERE end_date < hc.start_date AND number = lookupHouse),
        'From the very beginning...') AS nextRentBegins,
    start_date AS rentEndDay
FROM
    house_class hc
WHERE
    (SELECT count(*) FROM house_class
        WHERE number = lookupHouse AND rentEndDay < end_date AND rentEndDay > start_date) = 0);
Этот запрос выдаст все периоды, когда дом свободен. Какие нужно использовать индексы - можно понять по EXPLAIN.
Готового решения не буду приводить, чтобы было интересно и можно было учиться на задачах... Вы не против? :)
Back to top
View user's profile Send private message
RomanovAS
Участник форума



Joined: 17 May 2007
Posts: 29
Карма: 2
   поощрить/наказать


PostPosted: Sat May 19, 2007 10:50 am (спустя 1 час 29 минут; написано за 1 минуту 1 секунду)
   Post subject:
Reply with quote

Большое спасибо, Михаил! Я, конечно, не против ;), но от готового решения совсем не откозался бы.! :)
Back to top
View user's profile Send private message
Михаил Саяпин
Участник форума



Joined: 07 Apr 2007
Posts: 46
Карма: 15
   поощрить/наказать

Location: Санкт-Петербург

PostPosted: Sun May 20, 2007 11:32 am (спустя 1 день 41 минуту; написано за 3 минуты 6 секунд)
   Post subject:
Reply with quote

:) Договорились.

А вообще подумалось, что можно сделать все проще - ведь здесь нет пересечений, а верхний большой запрос был именно для учета пересечений. Поэтому конечное решение вот такое:
Code (SQL): скопировать код в буфер обмена
SELECT
        number,
        IF(end_date >= '2007-05-21' AND (SELECT coalesce(min(start_date), date_add(now(), interval 1 year))
                FROM house_class
                WHERE start_date >= hc.end_date AND number = hc.number) <= '2007-05-22', 1, 0) AS rentStart
FROM house_class hc
HAVING rentStart = 1
Где:
2007-05-21 - дата желаемого начала съема.
2007-05-22 - дата желаемого окончания.
date_add(now(), interval 1 year) - максимальный временной интервал возможности брони (здесь: текущая дата + 1 год).

Если не нужно, чтобы можно было въезжать в дом в тот же день, когда оттуда выезжают, смените в условиях "end_date >= '2007-05-21'" и "<= '2007-05-22'", >= на > и <= на <, соответственно.

Запрос выдаст все номера домов, в которых можно пожить в указанный промежуток. :)
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML